/**
 *
 *  Copyright (c) 2011, AstroDAbis
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without modification,
 *  are permitted provided that the following conditions are met:
 *
 *      * Redistributions of source code must retain the above copyright notice,
 *        this list of conditions and the following disclaimer.
 *      * Redistributions in binary form must reproduce the above copyright notice,
 *        this list of conditions and the following disclaimer in the documentation
 *        and/or other materials provided with the distribution.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 *  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 *  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 *  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 *  OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
package org.jiscinvolve.astrodabis.mallow.model.api;

//
// http://kentbeck.github.com/junit/javadoc/latest/org/junit/Assert.html
import org.junit.Test;
import static org.junit.Assert.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

//
// Persistent object interfaces.
import org.jiscinvolve.astrodabis.mallow.model.api.Tag;
import org.jiscinvolve.astrodabis.mallow.model.api.Query;
import org.jiscinvolve.astrodabis.mallow.model.api.Account;

import org.jiscinvolve.astrodabis.mallow.model.TestBase;
import org.jiscinvolve.astrodabis.mallow.model.jpa.DuplicateEntryException;

/**
 * JUnit test for Accounts.
 *
 */
public class AccountTestCase
extends TestBase
    {

    /**
     * Our debug logger.
     * 
     */
    private static Log log = LogFactory.getLog(AccountTestCase.class);

    /**
     * Test we can create an Account.
     *
     */
    @Test
    public void frog000()
    throws Exception
        {
        log.debug("AccountTestCase.frog000()");

        String name  = this.unique();
        String email = name + "@example.org" ;
        String pass  = "secret" ;

        Account account = manager().accounts().create(
            name,
            email,
            pass
            );

        assertNotNull(
            account
            );

        assertEquals(
            name,
            account.name()
            );

        assertEquals(
            email,
            account.email()
            );

        }

    /**
     * Test we can list all the Accounts.
     *
     */
    @Test
    public void frog001()
    throws Exception
        {
        log.debug("AccountTestCase.frog001()");

        for (Account account : manager().accounts().select())
            {
            debug(account);
            }

        }

    /**
     * Test we can't create an Account with duplicate name or email.
     *
     */
    @Test
    public void frog002()
    throws Exception
        {
        log.debug("AccountTestCase.frog000()");

        String name = this.unique();
        String mail = name + "@example.org" ;
        String pass = "secret" ;

        //
        // Create the first account.
        manager().accounts().create(
            "x-" + name,
            "x-" + mail,
            pass
            );

        //
        // Try create another with the same name.
        try {
            manager().accounts().create(
                "x-" + name,
                "y-" + mail,
                pass
                );
            fail("Test should have thrown DuplicateEntryException");
            }
        catch (DuplicateEntryException expected)
            {
            log.debug("DuplicateEntryException [" + expected.field() + "][" + expected.getMessage() + "]");
            assertEquals(
                "name",
                expected.field()
                );
            }

        //
        // Try create another with the same email.
        try {
            manager().accounts().create(
                "y-" + name,
                "x-" + mail,
                pass
                );
            fail("Test should have thrown DuplicateEntryException");
            }
        catch (DuplicateEntryException expected)
            {
            log.debug("DuplicateEntryException [" + expected.field() + "][" + expected.getMessage() + "]");
            assertEquals(
                "email",
                expected.field()
                );
            }

        //
        // Try create another with the same name and email.
        try {
            manager().accounts().create(
                "x-" + name,
                "x-" + mail,
                pass
                );
            fail("Test should have thrown DuplicateEntryException");
            }
        catch (DuplicateEntryException expected)
            {
// Either name OR email are legit.
            log.debug("DuplicateEntryException [" + expected.field() + "][" + expected.getMessage() + "]");
            assertEquals(
                "name",
                expected.field()
                );
            }

        //
        // Check we can still create an Account with new name and email.
        manager().accounts().create(
            "y-" + name,
            "y-" + mail,
            pass
            );

        }

    }

